// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Reflection;
using System.Runtime;
using Benchmarks.Configuration;

namespace Benchmarks;

public class Program
{
    public static string[] Args;

    public static void Main(string[] args)
    {
        Args = args;

        Console.WriteLine();
        Console.WriteLine("ASP.NET Core Benchmarks");
        Console.WriteLine("-----------------------");

        Console.WriteLine($"Current directory: {Directory.GetCurrentDirectory()}");
        Console.WriteLine($"WebHostBuilder loading from: {typeof(WebHostBuilder).GetTypeInfo().Assembly.Location}");

        var config = new ConfigurationBuilder()
            .AddJsonFile("hosting.json", optional: true)
            .AddEnvironmentVariables(prefix: "ASPNETCORE_")
            .AddCommandLine(args)
            .Build();

        var webHostBuilder = new WebHostBuilder()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .ConfigureServices(services => services
                .AddSingleton(new ConsoleArgs(args))
                .AddSingleton<IScenariosConfiguration, ConsoleHostScenariosConfiguration>()
                .AddSingleton<Scenarios>()
            )
            .UseDefaultServiceProvider(
                (context, options) => options.ValidateScopes = context.HostingEnvironment.IsDevelopment())
            .UseKestrel();

        var threadCount = GetThreadCount(config);

        webHostBuilder.UseSockets(x =>
        {
            if (threadCount > 0)
            {
                x.IOQueueCount = threadCount;
            }

            Console.WriteLine($"Using Sockets with {x.IOQueueCount} threads");
        });

        var webHost = webHostBuilder.Build();

        Console.WriteLine($"Server GC is currently {(GCSettings.IsServerGC ? "ENABLED" : "DISABLED")}");

        webHost.Run();
    }

    private static int GetThreadCount(IConfigurationRoot config)
    {
        var threadCountValue = config["threadCount"];
        return threadCountValue == null ? -1 : int.Parse(threadCountValue);
    }
}
